# !usr/bin/env python
# -*- coding:utf-8 _*-
"""
@Author:张广勤
@Web site: https://www.tunan.wang
@Github:www.github.com
 
@File:Yi_ben_jiao1_0.py
@Time:2024/8/8 12:08

@Motto:不积跬步无以至千里，不积小流无以成江海！
"""
import itertools
import csv
import streamlit as st

# 初始化一个空字典来存储结果
result_dict = {}
guaname_binary = {}
# 打开CSV文件
with open('./yi/yi2_0.csv', mode='r', newline='', encoding='utf-8') as file:
    csv_reader = csv.reader(file)

    # 跳过标题行（如果有的话）
    next(csv_reader, None)  # 假设标题行是CSV文件的第一行

    # 遍历CSV文件的每一行
    for row in csv_reader:
        # 假设每行至少有4个元素，这里只取第2个和第4个元素
        if len(row) >= 6:
            key = row[2]  # 第2个元素作为键
            value = (row[5],row[6])  # 第4,5个元素作为值
            # 将键值对添加到结果字典中
            # 注意：如果CSV中有重复的键，后面的值会覆盖前面的值
            result_dict[key] = value

        if len(row) >= 6:
            key = row[5]  # 第6个元素作为键
            value = (row[2],row[6])  # 第3个元素作为值
            # 将键值对添加到结果字典中
            # 注意：如果CSV中有重复的键，后面的值会覆盖前面的值
            guaname_binary[key] = value
# 打印结果字典
# print(result_dict)
# print(guaname_binary)

def key_value(key):
    return result_dict[key]

k64 = [
    '乾', '坤', '屯', '蒙', '需', '讼', '师', '比', '小畜', '履', '泰', '否',
    '同人', '大有', '谦', '豫', '随', '蛊', '临', '观', '噬嗑', '贲', '剥',
    '复', '无妄', '大畜', '颐', '大过', '坎', '离', '咸', '恒', '遁', '大壮',
    '晋', '明夷', '家人', '睽', '蹇', '解', '损', '益', '夬', '姤', '萃',
    '升', '困', '井', '革', '鼎', '震', '艮', '渐', '归妹', '丰', '旅', '巽', '兑',
    '涣', '节', '中孚', '小过', '既济', '未济'
]

# 定义八卦的二进制表示
gua = {
    "乾": "111",
    "兑": "110",
    "离": "101",
    "震": "100",
    "巽": "011",
    "坎": "010",
    "艮": "001",
    "坤": "000"
}

# 生成 64 卦的组合
all_gua = list(itertools.product(gua.keys(), repeat=2))

def get_binary_gua(gua_name):
    """
    根据卦名获取二进制表示
    """
    top_gua = gua[gua_name[0]]
    bottom_gua = gua[gua_name[1]]
    return top_gua + bottom_gua

def get_complement(binary_str):
    """
    获取二进制字符串的补码（错卦）
    """
    return ''.join('1' if c == '0' else '0' for c in binary_str)

def get_inverse(binary_str):
    """
    获取二进制字符串的逆序（综卦）
    """
    return binary_str[::-1]

def get_interchange(binary_str):
    """
    获取交卦，上下卦交换位置
    """
    mid = len(binary_str) // 2
    return binary_str[mid:] + binary_str[:mid]

# def get_mutual(binary_str):
#     """
#     获取互卦，二、三、四爻组成下卦，三、四、五爻组成上卦
#     """
#     mid = len(binary_str) // 2
#     top_mutual = binary_str[mid - 1:mid + 2]
#     bottom_mutual = binary_str[mid:mid + 3]
#     return top_mutual + bottom_mutual

def hexagram_to_binary(hexagram):
    """
    将易经卦象（如乾卦表示为'111111'）转换为二进制字符串。
    这里主要是为了确保输入是有效的，实际上如果直接以二进制字符串输入，这一步可以省略。
    """
    return bin(int(hexagram, 2))[2:].zfill(6)  # 确保是6位的二进制字符串


def get_inner_trigram(binary_hexagram):
    """
    从给定的64卦二进制字符串中提取中间四爻（即第二到第五爻）以形成互卦。
    然后，分割这四爻为下三爻和上三爻（实际上只取中间四爻中的前三爻为下卦，后两爻加上原卦的第五爻为上卦）。
    但这里我们简化为直接取第二、三、四爻为下卦，第三、四、五爻为上卦。
    """
    if len(binary_hexagram) != 6:
        raise ValueError("二进制卦象必须为6位")

    # 提取互卦的上下两卦（中间四爻）
    inner_trigram_lower = binary_hexagram[1:4]  # 下卦：第二、三、四爻
    inner_trigram_upper = binary_hexagram[2:5]  # 上卦：第三、四、五爻（注意这里实际上取了第五爻两次，但符合“互卦”的取法）

    return inner_trigram_lower, inner_trigram_upper


def calculate_mutual_hexagram(hexagram):
    """
    根据给定的64卦（二进制字符串形式），计算其互卦。
    """
    binary_hexagram = hexagram_to_binary(hexagram)
    lower_trigram, upper_trigram = get_inner_trigram(binary_hexagram)

    # 拼接互卦的上下两卦
    mutual_hexagram_binary = lower_trigram + upper_trigram[-3:]  # 注意这里只取upper_trigram的后两位，因为上卦实际是三爻

    # 将二进制字符串转换为易经卦象表示（这里简化为返回二进制字符串）
    return mutual_hexagram_binary

selected_item = st.sidebar.selectbox("本卦->综卦",k64)

if selected_item:
    binary_gua =guaname_binary[selected_item][0]
    # binary_gua = key_value(selected_item)
# for gua_name in all_gua:
#     binary_gua = get_binary_gua(gua_name)
    # print(type(binary_gua)) #<class 'str'>
    st.markdown(f"### 本卦: {binary_gua}, {key_value(binary_gua)}")
    st.markdown(f"#### 错卦: {get_complement(binary_gua)}, {key_value(get_complement(binary_gua))}")
    st.markdown(f"#### 综卦: {get_inverse(binary_gua)}, {key_value(get_inverse(binary_gua))}")
    st.markdown(f"#### 交卦: {get_interchange(binary_gua)}, {key_value(get_interchange(binary_gua))}")
    st.markdown(f"#### 互卦: {calculate_mutual_hexagram(binary_gua)}, {key_value(calculate_mutual_hexagram(binary_gua))}")
    st.markdown("***")
